﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Metro;
using DevComponents.DotNetBar;
using ProductManagement.Ultilities;

namespace ProductManagement.Forms
{
    /// <summary>
    /// Form thực hiện thêm chi tiết báo cáo
    /// </summary>
    public partial class AddReportDetailForm : MetroForm
    {
        #region Các trường

        /// <summary>
        /// ID của báo cáo muốn thêm chi tiết
        /// </summary>
        private int _rid;
        /// <summary>
        /// ReportForm gọi form này
        /// </summary>
        private ReportForm _reportForm;
        /// <summary>
        /// Đối tượng kiểm tra tính hợp lệ của dữ liệu người dùng nhập vào
        /// </summary>
        private Validator validator = new Validator();
        /// <summary>
        /// Đối tượng liên kết dữ liệu LinQ to SQL, để thao tác với cơ sở dữ liệu
        /// </summary>
        private ProductManagementClassesDataContext db = new ProductManagementClassesDataContext();

        #endregion

        #region Hàm khởi tạo

        /// <summary>
        /// Hàm khởi tạo không tham số
        /// </summary>
        public AddReportDetailForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Hàm khởi tạo có 2 tham số
        /// </summary>
        /// <param name="reportID">ID của báo cáo muốn thêm chi tiết</param>
        /// <param name="reportForm">ReportForm gọi form này</param>
        public AddReportDetailForm(int reportID, ReportForm reportForm)
        {
            _rid = reportID;
            _reportForm = reportForm;
            InitializeComponent();
        }

        #endregion

        #region Các phương thức khác

        /// <summary>
        /// Xóa các trường text của form, xóa báo lỗi
        /// </summary>
        private void ResetTextFields()
        {
            txtAddReportDetailName.ResetText();
            txtAddReportDetailPrice.ResetText();
            txtAddReportDetailQuantity.ResetText();
            txtAddReportDetailName.Focus();
            errorProvider1.Dispose();
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu nhập vào
        /// </summary>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        private bool ValidateReportDetailData()
        {
            bool isValidName = validator.ValidateName(txtAddReportDetailName, errorProvider1);
            bool isValidQuantity = validator.ValidateQuantity(txtAddReportDetailQuantity, errorProvider1);
            bool isValidPrice = validator.ValidatePrice(txtAddReportDetailPrice, errorProvider1);
            return (isValidName && isValidPrice && isValidQuantity);
        }

        #endregion

        #region Xử lý sự kiện

        /// <summary>
        /// Sự kiện thoát form
        /// </summary>        
        private void AddReportDetailForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            _reportForm.LoadReportDetailDgv();
        }

        /// <summary>
        /// Sự kiện nhấn nút OK (thoát form)
        /// </summary>
        private void btnExitAddReportDetail_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Sự kiện nhấn nút nhập lại (xóa các trường text và xóa báo lỗi)
        /// </summary>

        private void btnResetAddReportDetail_Click(object sender, EventArgs e)
        {
            ResetTextFields();
        }

        /// <summary>
        /// Sự kiện nhấn nút thêm (thêm chi tiết báo cáo vào báo cáo)
        /// </summary>        
        private void btnAddReportDetail_Click(object sender, EventArgs e)
        {
            if (ValidateReportDetailData())
            {
                //Hiển thị hộp thoại lựa chọn, lưu lựa chọn của người dùng vào biến dr
                DialogResult dr = MessageBoxEx.Show("Bạn có muốn thêm chi tiết báo cáo?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                //Nếu người dùng chọn Yes
                if (dr == DialogResult.Yes)
                {
                    string name = txtAddReportDetailName.Text;
                    int quantity = Int32.Parse(txtAddReportDetailQuantity.Text);
                    decimal price = Decimal.Parse(txtAddReportDetailPrice.Text);
                    //Thêm chi tiết báo cáo vào cơ sở dữ liệu
                    db.sp_InsertReportDetail(_rid, name, price, quantity);
                    MessageBoxEx.Show("Thêm chi tiết báo cáo thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    ResetTextFields();
                }
            }
        }

        #endregion
    }
}
